經過昨天的傳教文章,今天來為各位簡單介紹 DDD 學習路線以及這系列文章會涵蓋的範圍。
並在文末附上我評估對 DDD 感興趣的朋友有幫助的學習資源。
DDD 主要分為兩大部分,分別為:
下張圖展示 DDD 模式的全貌:
圖 1. DDD 設計全貌圖
source: Domain-Driven Design Reference
DDD 的戰略設計其目的在於協助我們捕捉和獲得領域知識Domain Knowledge,並且將其拆分成適當的大小以利後續分析處理,同時也讓我們能夠理解軟體的核心價值。戰略包括以下要點:
歷史小補充: 在 DDD 剛推出時,因為戰略部分非常抽象,所以很多人只學習可以立即導入程式碼中的戰術設計 又稱 DDDLite 模式。不過隨著程式碼逐漸增長,大家逐漸意識到沒有做好戰略設計,即使加入再多的戰術程式碼都是脆弱的。因為有了戰略打穩地基,團隊有了充足的領域知識與通用語言做後盾,才能準確設計系統的邊界以符合業務需求。
戰術設計幫助我們運用一些成熟的 Design Pattern 將戰略分析的成果以程式碼實現。有以下 Design Pattern 供使用:
以上三個由於負責領域的業務邏輯,因此又被稱為領域物件 Domain Object。
如果以上看得霧煞煞,可以看以下這張精美簡版:
完整放大版點此連結
以上說了那麼多,以下會跟大家介紹本次鐵人賽會涵蓋到的部分。戰略部分會依照以下順序展開:
進入戰術設計前,我會先介紹一些現代的架構來支援戰術與戰略的實現以做到「關注點分離」:
接著再進入大家期待的程式實作戰術設計:
最後有時間的話會找幾個簡單的 project 跟大家一起實作。
由於 DDD 大部分資源都以英文為主,且中文翻譯又容易有歧異,所以為了希望大家未來能無縫接軌英語資源,在專有名詞使用上,我都盡量以英文呈現 如 Bounded Context, Subdomain 等等 。因此會出現大量「晶晶體」也請多見諒。
本系列我主要是參考 [Implementing Domain-Driven Design]https://www.tenlong.com.tw/products/9787121224485 簡稱 IDDD 為主,此書實作內容非常豐富。不過不太建議新手直接拿來啃,最好是搭配本系列一起服用 XD
同時偶爾參考元祖書 Domain-Driven Design 與另一本好書 Patterns, Principles, and Practices of Domain-Driven Design 還有一堆網路文章與影片。
在程式語言實作方面,由於我熟悉的語言如 NodeJS 、 Python 等都不是純粹的物件導向語言,所以我就選用 TypeScript 主要程式語言來開發範例程式碼。如果你是用 JAVA 、 C# 、 PHP 等的朋友們...我只能說恭喜拉!網路上超多程式碼資源 尤其是 C#,可以從本系列理解概念後再上網找範例程式碼。
為了讓大家能快速上手 DDD 的概念,實踐方面我盡量都會寫出範例程式碼,但因為 30 天的極限挑戰下,若有錯誤也請各位不吝指出,我會立即修正,謝謝。
有書籍、文章、影片與社群資源,非免費資源我會在後面標注星號。
更多資源可以上 Awesome DDD 查看~
現在就加入 Domain-Driven Design Taiwan ,隨時更新活動與新知!
最近才剛辦完耗時半年的 Implementing Domain-Driven Design 的讀書會,如果對讀書會有興趣請密切關注!
也可以到 ddd-tw/ddd-events 翻翻過去活動留下來的資源。
最後感謝社群夥伴 Kim, Arther, Tim, James 為這篇提供許多精闢的建議。
重點大綱: